//
//  ViewController.swift
//  SwiftRuntimeExchangeMethod
//
//  Created by liy on 2024/10/11.
//https://blog.csdn.net/chenqiangblock/article/details/80180566
//https://blog.csdn.net/qq_14920635/article/details/85543388
import UIKit

class ViewController: UIViewController {
	override func viewDidAppear(_ animated: Bool) {
		super.viewDidAppear(animated)
		print("这是一个方法")
	}
	override func viewDidLoad() {
		super.viewDidLoad()
	}


}

extension UIViewController {
	public class func initializeMethod(){
		let originalSelector = #selector(UIViewController.viewDidAppear(_:))
		let swizzledSelector = #selector(UIViewController.myMethod(animated:))
		
		let originalMethod = class_getInstanceMethod(self, originalSelector)
		let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
		
		
			//在进行 Swizzling 的时候,需要用 class_addMethod 先进行判断一下原有类中是否有要替换方法的实现
		let didAddMethod: Bool = class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod!), method_getTypeEncoding(swizzledMethod!))
			//如果 class_addMethod 返回 yes,说明当前类中没有要替换方法的实现,所以需要在父类中查找,这时候就用到 method_getImplemetation 去获取 class_getInstanceMethod 里面的方法实现,然后再进行 class_replaceMethod 来实现 Swizzing
		
		if didAddMethod {
			class_replaceMethod(self, swizzledSelector, method_getImplementation(originalMethod!), method_getTypeEncoding(originalMethod!))
		} else {
			method_exchangeImplementations(originalMethod!, swizzledMethod!)
		}
		
	}
	
	@objc func myMethod(animated: Bool) {
		self.myMethod(animated: animated)
		print("替换了")
		
	}
}
